package datastructure.array;

/**
 * 示例 1：
 * <p>
 * 输入：target = 7, nums = [2,3,1,2,4,3]
 * 输出：2
 * 解释：子数组 [4,3] 是该条件下的长度最小的子数组。
 * LC209
 * 先从0开始往后累加，如果累加值大于等于目标值，则把第一个元素的值减去，再判断剩余的值还是不是大于等于目标值，如果还大于则再减去第二个元素的值，依次下去
 * 如果减去元素后的值有小于目标值了，则再往后累加，直到又大于目标值
 */
public class LC209 {
    public int minSubArrayLen(int target, int[] nums) {
        int count = Integer.MAX_VALUE;
        int sum = 0;
        //需要减去的元素下标
        int left = 0;
        for (int i = 0; i < nums.length; i++) {
            sum += nums[i];
            while (sum >= target) {
                //取最短的元素个数，i-left+1表明这一次累加和大于目标值的元素个数，每一次的值可能不一样，需要使用最小的值
                count = Math.min(i-left+1,count);
                //累加值大于目标值，则减去数组最前面的元素，减去后，需要将left指向下一个元素
                sum -= nums[left++];
            }
        }
        return count == Integer.MAX_VALUE ? 0 :count;
    }
}